package com.solution.admin.point.service.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.solution.admin.coupon.constants.CouponConstants.IsUsed;
import com.solution.admin.point.constants.PointConstants;
import com.solution.admin.point.dao.PointMonthDao;
import com.solution.admin.point.dao.PointMonthModifyDao;
import com.solution.admin.point.entity.PointMonthEntity;
import com.solution.admin.point.entity.PointMonthModifyEntity;
import com.solution.admin.point.service.PointMonthService;
import com.solution.admin.point.service.PointService;
import com.solution.common.dao.BaseDao;
import com.solution.common.exception.BizException;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;
import com.solution.common.service.impl.BaseServiceImpl;

/**
 * 月度积分统计信息service实现层
 * 
 * @author xu_cc
 * @date 2017-10-20 14:21:47
 */
@Service
public class PointMonthServiceImpl extends BaseServiceImpl<PointMonthEntity> implements PointMonthService {

	/**
	 * 月度积分统计信息接口
	 */
	@Autowired
	private PointMonthDao pointMonthDao;

	@Autowired
	PointMonthModifyDao pointMonthModifyDao;

	@Autowired
	PointService pointService;

	protected BaseDao<PointMonthEntity> getDao() {
		return this.pointMonthDao;
	}

	/**
	 * 保存月度积分统计信息
	 * 
	 * @param pointMonthEntity
	 *            月度积分统计信息实体
	 * @return Long 添加成功月度积分统计信息的ID
	 * @author xu_cc
	 * @date 2017-10-20 14:21:47
	 */
	public long savePointMonth(PointMonthEntity pointMonthEntity) {
		return pointMonthDao.savePointMonth(pointMonthEntity);
	}

	/**
	 * 分页查询月度积分统计信息
	 * 
	 * @param pageParam
	 *            分页参数
	 * @param paramMap
	 *            查询参数
	 * @return PageBean 分页参数和分页数据
	 * @author xu_cc
	 * @date 2017-10-20 14:21:47
	 */
	@Override
	public PageBean listPointMonthPage(PageParam pageParam, Map<String, Object> paramMap) {
		return pointMonthDao.listPointMonthPage(pageParam, paramMap);
	}

	/**
	 * 根据ID查询用户信息
	 * 
	 * @param id
	 *            用户id
	 * @return pointMonthEntity 用户对象
	 * @author xu_cc
	 * @date 2017-10-20 14:21:47
	 */
	public PointMonthEntity getPointMonthById(Long id) {
		return pointMonthDao.getById(id.longValue());
	}

	/**
	 * 更新用户
	 * 
	 * @param pointMonthEntity
	 *            用户实体
	 * @return Long 更新是否成功，>1代表更新成功
	 * @author xu_cc
	 * @date 2017-10-20 14:21:47
	 */
	@Override
	public int updatePointMonth(PointMonthEntity pointMonthEntity) {
		return pointMonthDao.updatePointMonth(pointMonthEntity);
	}

	/**
	 * 根据条件查询月度积分统计信息
	 * 
	 * @param param
	 * @return 数据列表
	 * @author xu_cc
	 * @date 2017-10-20 14:21:47
	 */
	@Override
	public List<PointMonthEntity> listPointMonth(Map<String, Object> param) {
		return pointMonthDao.listPointMonth(param);
	}

	/**
	 * 获取指定月份的积分统计信息
	 * 
	 * @Title: getPointByMonth
	 * @Description:(描述)
	 * @param month
	 * @return List<PointMonthEntity>
	 * @author xu_cc
	 * @throws Exception
	 *             exception
	 * @Date 创建时间：2017年10月25日 下午5:43:12
	 */
	public List<PointMonthEntity> getPointByMonth(String month) {
		return pointMonthDao.getPointByMonth(month);
	}

	/**
	 * 先删除指定月份信息，然后再批量插入
	 * 
	 * @Title: insertList
	 * @Description:(描述)
	 * @param list
	 * @return int
	 * @author xu_cc
	 * @throws Exception
	 *             exception
	 * @Date 创建时间：2017年10月25日 下午5:58:18
	 */
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public int insertList(String month, List<PointMonthEntity> list) {
		// 先删除
		deleteByMonth(month);
		// 执行插入
		return pointMonthDao.insertList(list);
	}

	/**
	 * 删除指定月份的所有月度积分统计信息
	 * 
	 * @param id
	 * @return
	 * @author xu_cc
	 * @date 2017-10-20 14:21:47
	 */
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public int deleteByMonth(String month) {
		return pointMonthDao.deleteByMonth(month);
	}

	/**
	 * 每月月初根据指定月份生成期初积分信息
	 * 
	 * @param month
	 * @return int
	 * @author xu_cc
	 * @throws Exception
	 *             exception
	 * @Date 创建时间：2017年10月25日 下午6:48:39
	 */
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public int insertMonthBegin(String month) {
		pointMonthDao.deleteByMonth(month);
		return pointMonthDao.insertMonthBegin(month);
	}

	/**
	 * 确认月度积分修改信息，更新到当前系统中
	 * 
	 * @param userCode
	 * @return int
	 * @author xu_cc
	 * @throws Exception
	 *             exception
	 * @Date 创建时间：2017年12月1日 上午10:28:25
	 */
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public int doConfirmMonthModify(Map<String, Object> param) throws Exception {
		int rows = 0;
		try {
			String month = (String)param.get("month");
			param.put("month", month);
			// 查询本月度的积分数据，将订单积分增加到客户积分账户余额中
			List<PointMonthEntity> pointMonthList = pointMonthDao.listPointMonth(param);
			
			// 修改本月度积分确认状态；标识本月所有积分已确认
			//param.put("isUsed", IsUsed.UN_USED);
			//List<PointMonthModifyEntity> pointMonthModifyList = pointMonthModifyDao.listPointMonthModify(param);
			
			if (null != pointMonthList && pointMonthList.size() > 0) {
				for (PointMonthEntity pointMonth : pointMonthList) {
					// 操作积分
					rows += pointService.doOperatePointCommon(pointMonth.getCustomerId(), 
							PointConstants.PointOperateFlag.FLAG_ADD.getId(), 
							PointConstants.PointOperateType.OPT_BUY_GIFT.getCode(),
							pointMonth.getOrderPoint(), ("订单增加积分调整，月份：" + month), null, null, "系统", true);
				}
				// 更新修改记录为已确认状态
				pointMonthModifyDao.updatePointMonthModifyStatus(param);
				// 修改本月积分确认状态为已确认,插入一条确认记录
				param.put("confirmStatus", "1");
				param.put("confirmTime", new Date());
				param.put("confirmUser", param.get("confirmUser"));
				pointMonthModifyDao.insertPointMonthConfirmStatus(param);
			} else {
				// 没有修改的记录需要审核确认
				rows = -1;
			}
		} catch (Exception e) {
			// 抛出自定义异常，事务回滚
			throw new BizException("积分确认失败");
		}
		return rows;
	}

	/**
	 * 获取月度积分调整列表
	 * 
	 * @param param
	 * @return List<PointMonthModifyEntity>
	 * @author xu_cc
	 * @throws Exception
	 *             exception
	 * @Date 创建时间：2017年12月1日 上午10:24:35
	 */
	public List<PointMonthModifyEntity> listMonthModifyList(Map<String, Object> param) {
		return pointMonthModifyDao.listPointMonthModify(param);
	}

	/**
	 * 保存月度积分调整
	 * 
	 * @param monthModify
	 * @return Long
	 * @author xu_cc
	 * @throws Exception
	 *             exception
	 * @Date 创建时间：2017年12月1日 上午10:26:14
	 */
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public Long saveMonthModify(PointMonthModifyEntity monthModify) {
		Long customerId = monthModify.getCustomerId();
		String month = monthModify.getMonth();
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("customerId", customerId);
		param.put("month", month);
		param.put("isUsed", IsUsed.UN_USED);
		List<PointMonthModifyEntity> pointMonthModifyList = pointMonthModifyDao.listPointMonthModify(param);
		if (null != pointMonthModifyList && pointMonthModifyList.size() > 0) {
			// 修改（只要原记录的ID）
			Long id = pointMonthModifyList.get(0).getId();
			monthModify.setId(id);
			pointMonthModifyDao.updatePointMonthModify(monthModify);
			return 1l;
		} else {
			// 保存
			return pointMonthModifyDao.savePointMonthModify(monthModify);
		}
	}
	
	/**
	 * 查询月度积分确认状态
	 * @param param
	 * @return
	 */
	public PointMonthModifyEntity selectPointMonthConfirmStatus(Map<String, Object> param){
		return pointMonthModifyDao.selectPointMonthConfirmStatus(param);
	}
}
